<?php
require_once( ROOT_DATA_ACCESS_OBJECT . 'DataAccessObject.class.php');
require_once( ROOT_DATA_OBJECT . 'DataObject.class.php');

class ProjetoBO extends DataAccessObject {
	
	function listarProjetos($instanceDB, $limit, $start, $filter){
		$sqlQuery = "SELECT ";
		$sqlQuery .= "a.codigo, a.TipoProjeto_codigo, a.nome, a.beneficios, a.objetivos, a.idealizadores, a.dataRealizacao, a.patrocinio, a.meta, a.dataInicio, a.dataFim, a.situacao, b.nome as tipoProjeto "; 
		$sqlQuery .= "FROM ";
		$sqlQuery .= "Projeto a, TipoProjeto b ";
		$sqlQuery .= "WHERE ";
		$sqlQuery .= "a.TipoProjeto_codigo = b.codigo ";
		if($filter != ""){
			$sqlQuery .= "AND a.nome LIKE '%".$filter."%' ";
		}
		$sqlQuery .= "ORDER BY nome ";
		
		$quantidadeRegistros = $this->quantidadeRegistros($instanceDB, $sqlQuery);
		
		// Controle da paginação
		if($limit != "" && $start != ""){
			$sqlQuery .= "LIMIT ".$start.",".$limit." ";
		}
		
		$listProjetos = $this->execute( $instanceDB, $sqlQuery, "SELECT" );
		
		$result = array("object" => $listProjetos, "qtdRegistros" => $quantidadeRegistros);
		
		return $result;
	}
	
	function quantidadeRegistros($instanceDB, $sqlQuery){
		$qtdRegistros = $this->execute( $instanceDB, $sqlQuery, "SELECT" );
		return count($qtdRegistros);
	}
	
	function listarVoluntarioProjeto($instanceDB, $codigoProjeto) {

		$sqlQuery = "SELECT "; 
		$sqlQuery .= "c.nome, c.codigo, COUNT(b.codigo) as qtdAtividades "; 
		$sqlQuery .= "FROM ";
		$sqlQuery .= "Projeto a, Atividade b, Pessoa c, Voluntario d ";
		$sqlQuery .= "WHERE ";
		$sqlQuery .= "a.codigo = " .$codigoProjeto." AND ";
		$sqlQuery .= "b.Projeto_codigo = a.codigo AND ";
		$sqlQuery .= "d.Pessoa_codigo = b.Voluntario_Pessoa_codigo AND ";
		$sqlQuery .= "c.codigo = d.Pessoa_codigo ";
		$sqlQuery .= "GROUP BY c.nome ";
		
		return $this->execute( $instanceDB, $sqlQuery, "SELECT" );
		
	}
	
	/*
	 * @description: Método responsável por retornar o custo estimado do projeto
	 * @author: Willian Vieira
	 * @params: $codigoProjeto(código do projeto)
	 * @return: Custo estimado do projeto
	*/	
	//Metodo cria um objeto da classe atividadeBO, ele recebe como parametro uma lista de objetos como parametro
	function calculaEstimativaCusto($instanceDB, $codigoProjeto){
		
		$somatoriaAtividade = new AtividadeBO();
		
		$atividadeComCusto = $this->listarAtividadeComCusto($instanceDB,$codigoProjeto);
		return $somatoriaAtividade->somatoriaAtividades($instanceDB, $atividadeComCusto);
		
	}
	
	//divide a quantidade de atividades concluidas pela quatidade de atividade de um projeto
	function calculaProgresso($instanceDB, $codigoProjeto){
		$qtdeAtividades = $this->quantidadeAtividades($instanceDB, $codigoProjeto);
		$qtdeAtividadesConcluidas = $this->quantidadeAtividadesConcluidas($instanceDB, $codigoProjeto);
		return @($qtdeAtividadesConcluidas[0]->get("totalConcluidas") / $qtdeAtividades[0]->get("total")) * 100 ."%";
	}
	
	//retorna a quantidade de atividades de um projeto
	function quantidadeAtividades($instanceDB, $codigoProjeto){
		$sqlQuery = "SELECT "; 
		$sqlQuery .= "count(*) as total "; 
		$sqlQuery .= "FROM ";
		$sqlQuery .= "Atividade ";
		$sqlQuery .= "WHERE ";
		$sqlQuery .= "Projeto_codigo=".$codigoProjeto;
		return $this->execute( $instanceDB, $sqlQuery, "SELECT" );		
		
	}
	
	//retorna a quantidade de atividades concluidas d eum projeto
	function quantidadeAtividadesConcluidas($instanceDB, $codigoProjeto){
		$sqlQuery = "SELECT "; 
		$sqlQuery .= "count(*) as totalConcluidas "; 
		$sqlQuery .= "FROM ";
		$sqlQuery .= "Atividade ";
		$sqlQuery .= "WHERE ";
		$sqlQuery .= "Projeto_codigo=".$codigoProjeto." AND ";
		$sqlQuery .= "dataFimRealizado IS NOT NULL AND dataFimRealizado <> '0000-00-00' ";
		return $this->execute( $instanceDB, $sqlQuery, "SELECT" );
	}
	
	//metodo que traz a máxima data de todas as atividades de um projeto, sendo ela a data de término do projeto
	function maxDataAtividade($instanceDB, $codigoProjeto){
		$sqlQuery = "SELECT "; 
		$sqlQuery .= "max(dataFim) as maxData "; 
		$sqlQuery .= "FROM ";
		$sqlQuery .= "Atividade ";
		$sqlQuery .= "WHERE ";
		$sqlQuery .= "Projeto_codigo=".$codigoProjeto;
		return $this->execute( $instanceDB, $sqlQuery, "SELECT" );
	}

	/*
	 * @description: Método responsável por retornar um Array de objetos de atividade com custo
	 * @author: Willian Vieira
	 * @params: $codigoProjeto(código do projeto)
	 * @return: Array de atividades com custo
	*/	
	function listarAtividadeComCusto($instanceDB, $codigoProjeto){
		
		$sqlQuery = "SELECT "; 
		$sqlQuery .= "b.codigo, b.titulo, c.nome as voluntarioResponsavel, b.dataInicio, b.dataFim, b.ordemTarefa, b.valorEstimado as valorEst, b.valorOrcado, b.prioridade, b.custo, b.situacao "; 
		$sqlQuery .= "FROM ";
		$sqlQuery .= "Atividade b, Pessoa c ";
		$sqlQuery .= "WHERE ";
		$sqlQuery .= "b.Projeto_codigo = " .$codigoProjeto." AND ";
		$sqlQuery .= "c.codigo = b.Voluntario_Pessoa_codigo AND ";
		$sqlQuery .= "b.custo = 'S' ";
		return $this->execute( $instanceDB, $sqlQuery, "SELECT" );
	}
	
	
	
	
	
	function capturarProjeto($instanceDB, $codigoProjeto){
		
		$sqlQuery = "SELECT * FROM Projeto WHERE codigo = " .$codigoProjeto;
		return $this->execute( $instanceDB, $sqlQuery, "SELECT" );
	
	}
	
	function capturarAlunoProjeto($instanceDB, $codigoProjeto, $codigoAluno){
			
		$sqlQuery = "SELECT * FROM ProjetoAluno WHERE Projeto_codigo = " .$codigoProjeto. " AND ";
		$sqlQuery .= "Aluno_Pessoa_codigo = ".$codigoAluno;
		echo "$sqlQuery";
		return $this->execute( $instanceDB, $sqlQuery, "SELECT" );
	}

	function inserir( $instanceDB, $dataObject ){
		$codigo = ($this->getMax( $instanceDB, $dataObject->table, "codigo" )+1);
		$dataObject->set("codigo", $codigo);
		$resultado = $this->insert( $instanceDB, $dataObject );
		if ( $resultado ){
			return $this->capturarProjeto( $instanceDB, $dataObject->get("codigo") );
		}
		return FALSE;
	}
	
	function alterar( $instanceDB, $dataObject ){
		return $resultado = $this->update( $instanceDB, $dataObject );
	}
	
	function excluir( $instanceDB, $dataObject ){
		return $this->delete( $instanceDB, $dataObject );
	}
	
	//Tarefas Lelex
	function calculaGastos($instanceDB, $codigoProjeto){
		
		$somatoriaAtividade = new AtividadeBO();
		
		$atividadeGastos = $this->listarAtividadeGastos($instanceDB,$codigoProjeto);

		return $somatoriaAtividade->somatoriaAtividadesGastos($instanceDB, $atividadeGastos);
		
	}
	
	function listarAtividadeGastos($instanceDB, $codigoProjeto){
		
		$sqlQuery = "SELECT "; 
		$sqlQuery .= "a.codigo, a.titulo, p.nome as voluntarioResponsavel, a.dataInicio, a.dataFim, a.ordemTarefa, a.valorEstimado, a.valorOrcado, a.prioridade, a.custo, a.situacao, m.valorOperacao "; 
		$sqlQuery .= "FROM ";
		$sqlQuery .= "Atividade a,  Pessoa p, MovimentoCaixa m ";
		$sqlQuery .= "WHERE ";
		$sqlQuery .= "a.Voluntario_Pessoa_codigo = p.codigo AND ";
		$sqlQuery .= "a.Projeto_codigo = " .$codigoProjeto." AND ";
		$sqlQuery .= "a.codigo = m.Atividade_codigo AND ";
		$sqlQuery .= "a.custo = 'S' AND ";
		$sqlQuery .= "m.valorOperacao IS NOT NULL";
		return $this->execute( $instanceDB, $sqlQuery, "SELECT" );
	}	
	
	

	
	/*
	 * @author				: Willian Silva
	 * @description			: Metodo responsavel por calcular o saldo de um projeto
	 * @params				: DataObject
	 * @return				: Retorna o saldo de um projeto
	*/
	function calculaSaldoProjeto($instanceDB, $codigoProjeto){
		$DotacaoBO = new DotacaoBO();
		
		$listDotacoes = $DotacaoBO->listarDotacoes($instanceDB,$codigoProjeto);
		
		for ($i = 0; $i < count($listDotacoes); $i++){
			
			$aux += $DotacaoBO->calculaSaldoDotacao($instanceDB,$listDotacoes[$i]->get("codigo"));
		}
		
		return $aux;
			
	}
	
	
	//soma o valor estimado todas as atividades com custo na tabela atividade e que
	//não constam na tabela movimentocaixa	
	function custoProjetoSemMovimentoCaixa($instanceDB, $codigoProjeto) {

		$sqlQuery = "SELECT "; 
		$sqlQuery .= "sum(a.valorEstimado) as valorEst "; 
		$sqlQuery .= "FROM ";
		$sqlQuery .= "Atividade a ";
		$sqlQuery .= "WHERE ";
		$sqlQuery .= "a.custo = 's' AND ";
		$sqlQuery .= "a.codigo not in (Select Atividade_codigo from MovimentoCaixa Where a.codigo = Atividade_codigo) AND ";
		$sqlQuery .= "a.Projeto_codigo= " .$codigoProjeto . " ";
		$sqlQuery .= "group by a.Projeto_codigo";
		return $this->execute( $instanceDB, $sqlQuery, "SELECT" );
	}

	//soma o valor Operação de todas as atividades com custo na tabela atividade e que
	//constam na tabela movimentocaixa	
	function custoProjetoComMovimentoCaixa($instanceDB, $codigoProjeto) {

		$sqlQuery = "SELECT "; 
		$sqlQuery .= "sum(m.valorOperacao) as valorOpe "; 
		$sqlQuery .= "FROM ";
		$sqlQuery .= "MovimentoCaixa as m ";
		$sqlQuery .= "INNER JOIN ";
		$sqlQuery .= "Atividade as a on ";
		$sqlQuery .= "m.Atividade_codigo = a.codigo ";
		$sqlQuery .= "WHERE (a.Projeto_codigo= " .$codigoProjeto. ")";
		return $this->execute( $instanceDB, $sqlQuery, "SELECT" );
	}

	//Soma dos valores estimados das atividades e do movimento de caixa(caso a atividade já tenha sido realizada)
	function projecaoEstimativa($instanceDB,$codigoProjeto)
	{
		$custoProjComMov = $this->custoProjetoComMovimentoCaixa($instanceDB,$codigoProjeto);
		$custoProjSemMov = $this->custoProjetoSemMovimentoCaixa($instanceDB,$codigoProjeto);
		
		
		if($custoProjSemMov[0] == null && $custoProjComMov[0] == null){
			return 0;
		}else if($custoProjSemMov[0] == null){
			return $custoProjComMov[0]->get("valorOpe");
		}else if($custoProjComMov[0] == null){
			return $custoProjSemMov[0]->get("valorEst");
			
		}else if($custoProjSemMov[0] != null && $custoProjComMov[0] != null){
			return $custoProjComMov[0]->get("valorOpe") + $custoProjSemMov[0]->get("valorEst");
			
		}
		
		
		/*
		if(is_null($custoProjComMov[0]->get("valorOpe")) || is_null($custoProjSemMov[0])){
			
			if(is_null($custoProjComMov[0]->get("valorOpe"))){
				return $custoProjSemMov[0]->get("valorEst");
			}else if(is_null($custoProjSemMov[0])){
				return $custoProjComMov[0]->get("valorOpe");			
			}
		}else{
			return $custoProjComMov[0]->get("valorOpe") + $custoProjSemMov[0]->get("valorEst");		
		}
		*/
	
		

	}
	

	//Utilizado no listarAtividadeComCusto() ProjetoController.
	function valorOperacao($instanceDB,$codigoAtividade)
	{
		$sqlQuery = "SELECT ";
		$sqlQuery .= "m.valorOperacao as valorOpe, m.Atividade_codigo as AtCodMov ";
		$sqlQuery .= "FROM "; 
		$sqlQuery .= "MovimentoCaixa as m, ";
		$sqlQuery .= "Atividade as a ";
		$sqlQuery .= "WHERE "; 
		$sqlQuery .= "a.codigo =" .$codigoAtividade; 
		$sqlQuery .= " AND m.Atividade_codigo = " .$codigoAtividade;
		return $this->execute( $instanceDB, $sqlQuery, "SELECT" ); 
	}
	
	/*
	 * @author				: Willian Silva
	 * @description			: Metodo responsavel por matricular um aluno em um projeo
	 * @params				: DataObject
	 * @return				: Retorna uma mensagem do tipo TRUE ou FALSE
	*/	
	function matricularAluno($instanceDB, $dataObject){
		
		return $resultado = $this->insert( $instanceDB, $dataObject );		
	}
	
	/*
	 * @author				: Willian Silva
	 * @description			: Metodo responsavel por excluir matricula de um projeto
	 * @params				: DataObject
	 * @return				: Retorna uma mensagem do tipo TRUE ou FALSE
	*/	
	function excluirMatricula( $instanceDB, $dataObject ){
		
		return $this->delete( $instanceDB, $dataObject );
		
	}
	

	/*
	 * @author				: Willian Silva
	 * @description			: Metodo responsavel por desmatricular um aluno de um projeo
	 * @params				: DataObject
	 * @return				: Retorna uma mensagem do tipo TRUE ou FALSE
	*/	
	function alteraSituacaoMatricula( $instanceDB, $dataObject ){
		return $this->update( $instanceDB, $dataObject );
	}
		
		
	/*
	 * @author				: Willian Silva
	 * @description			: Metodo responsavel por listar alunos matriculados em um projeto
	 * @params				: Código do projeto
	 * @return				: Retorna alunos matriculados em projeto
	*/
	function listarAlunosMatriculados($instanceDB, $codigoProjeto){
		
		$sqlQuery = "SELECT ";
		$sqlQuery .= "b.nome, c.Pessoa_codigo as codigo, a.situacao ";
		$sqlQuery .= "FROM ";
		$sqlQuery .= "ProjetoAluno a, Pessoa b, Aluno c ";
		$sqlQuery .= "WHERE ";
		$sqlQuery .= "b.codigo = c.Pessoa_codigo AND ";
		$sqlQuery .= "a.Aluno_Pessoa_codigo = c.Pessoa_codigo AND ";
		$sqlQuery .= "a.Projeto_codigo = " . $codigoProjeto;
		return $this->execute( $instanceDB, $sqlQuery, "SELECT" );
	}
	
 	/* @author				: Willian Silva
	 * @description			: Metodo responsavel por listar alunos desmatriculados em um projeto
	 * @params				: DataObject
	 * @return				: Retorna alunos desmatriculados em projeto
	*/
	function listarAlunosDesmatriculados($instanceDB, $codigoProjeto){
		$sqlQuery = "SELECT "; 
		$sqlQuery .= "b.nome, c.Pessoa_codigo as codigo "; 
		$sqlQuery .= "FROM "; 
		$sqlQuery .= "Pessoa b, Aluno c ";
		$sqlQuery .= "WHERE ";  
		$sqlQuery .= "b.codigo = c.Pessoa_codigo ";
		$sqlQuery .= "AND ";      
		$sqlQuery .= "c.Pessoa_codigo not in (select p.Aluno_Pessoa_Codigo from ProjetoAluno p where p.Aluno_Pessoa_Codigo = c.Pessoa_codigo AND p.Projeto_codigo = ".$codigoProjeto.") ";
		$alunosDesmatriculados = $this->execute( $instanceDB, $sqlQuery, "SELECT" );
		
		for ($i = 0; $i < count($alunosDesmatriculados); $i++){
			$alunosDesmatriculados[$i]->add("situacao", "S"); 
		}
		
		return $alunosDesmatriculados;
	}
	
	
	
	function listarAtividadesSemMovimento($instanceDB, $codigoProjeto){
		$sqlQuery = "SELECT ";
		$sqlQuery .= "a.codigo, a.titulo, a.dataInicio, a.dataFim, a.ordemTarefa, a.valorEstimado as valorEst, a.valorOrcado, a.prioridade, a.custo, a.situacao "; 
		$sqlQuery .= "FROM ";
		$sqlQuery .= "Atividade a ";
		$sqlQuery .= "WHERE ";
		$sqlQuery .= "a.Projeto_codigo = ".$codigoProjeto ." AND ";
		$sqlQuery .= "a.custo = 'S' AND ";
		$sqlQuery .= "a.codigo not in (select m.Atividade_codigo from MovimentoCaixa m where m.Atividade_codigo = a.codigo) ";
		
		return $this->execute( $instanceDB, $sqlQuery, "SELECT" );
	}
	
}

?>
